
<!DOCTYPE html>
<html>
<head>
    <style>
        p {
            font-size: 20px;
        }
        /*
        code {
            margin-left: 50px;
        }
        */
    </style>
</head>
<body>
    <div style="margin:50px; margin-right:600px">

        <h1>概述</h1>
        <p>rgrub利用grub和http协议控制多启动的终端从预先配置指定的系统启动。具体的做法是在终端增加一个名为rgrub的grub menuentry，终端默认从这个menuentry启动到text模式的linux系统，并向服务器请求真实的menuentry。服务器根据配置文件返回menuentry的编号给终端，终端通过命令<code>grub-reboot <i>next</i></code> 指定menuentry，随后重启即可启动到指定的menuentry。</p>

        <h1>Server</h1>
        <p>编辑rgrub.conf为终端指定要启动的系统，使用mac地址来标识终端</p>
            <pre>
            52:54:00:2b:a0:b7 0
            52:54:00:2b:a0:b7 0
            </pre>
        <p>启动服务，参数分别是监听端口和配置文件</p>
            <pre>
            ./rgurb <i>port</i> <i>config</i> &
            </pre>

        <h1>Client</h1>
        <p>客户端的工作主要由两个脚本完成，install.sh脚本进行必要的配置工作并把相关的文件如remote_grub.sh等放到工作目录/opt/rgrub/，remote_grub.sh与服务器通信并获取预先配置的对应此客户端的menuentry。</p>
        <p>在客户端只需执行install.sh即可</p>
            <pre>
            ./install.sh
            </pre>

        <h1>Protocol</h1>
        <p>客户端和服务器只有一个简单的交互，通过POST方法访问<code>http://server_ip:port/rgrub</code>，并增加了一个名为RGrub的header，其内容是客户端的mac地址</p>
            <pre>
            POST /rgrub HTTP/1.1
            User-Agent: Wget/1.15 (linux-gnu)
            Accept: */*
            Host: 192.168.100.11:8080
            Connection: Keep-Alive
            Content-Type: application/x-www-form-urlencoded
            Content-Length: 167
            RGrub: 52:54:00:2b:a0:b7

            Ubuntu, with Linux 4.4.0-31-generic
            Ubuntu, with Linux 4.4.0-31-generic (recovery mode)
            Memory test (memtest86+)
            Memory test (memtest86+, serial console 115200)
            rgrub
            </pre>
        <p>服务端的应答是对应此mac地址的menuentry编号</p>
            <pre>
            HTTP/1.1 200 OK
            Date: Thu, 27 Apr 2017 07:31:22 GMT
            Content-Length: 1
            Content-Type: text/html; charset=ISO-8859-1

            0
            </pre>
    </div>
</body>
</html>
